#include "remote.h"
#include "main.h"

unsigned char UART3_RECV_BUF[REMOTE_CONTROL_FRAME_SIZE]; // 串口3 接受 缓存
extern UART_HandleTypeDef huart3;
// 遥控器数据
RC_ctrl_t rc_ctrl; //[0]:当前数据TEMP,[1]:上一次的数据LAST.用于按键持续按下和切换的判断

void remote_init(void)
{
    __HAL_UART_ENABLE_IT(&huart3, UART_IT_IDLE);                              // 串口3使能
    HAL_UART_Receive_DMA(&huart3, UART3_RECV_BUF, REMOTE_CONTROL_FRAME_SIZE); // 串口3DMA接收初始化
}
/**
 * @brief 遥控器数据解析
 *
 * @param sbus_buf 接收buffer
 */
void sbus_to_rc(uint8_t *sbus_buf)
{
    if (sbus_buf[0] == 0x0f && sbus_buf[24] == 0x00)
    {
        //  以通道1的数据解析为例进行计算步骤的解释
        //  设定的8位数中字母代表可能为0/1；
        //  设sbus_buf[2]				：abcd efgh
        //  0xf8												：1111 1000
        //	sbus_buf[2]&0xf8			：abcd e000
        //  sbus_buf[2]&0xf8>>3	：000a bcde

        //  设sbus_buf[3]    		：ijkl mnop
        //  0x3f												：0011 1111
        //  sbus_buf[3]&0x3f 		：00kl mnop
        //  sbus_buf[3]&0x3f)<<5	：klm nop0 0000

        //  000a bcde | klm nop0 0000 = 0000 0klm nopa bcde（最终结果CH[1]为16位）

        rc_ctrl.CH[0] = (sbus_buf[1]) | ((sbus_buf[2] & 0x07) << 8);                                       // 缓存[1]8位 并 取出缓存[2]低三位左移8位 （总计11位）
        rc_ctrl.CH[1] = ((sbus_buf[2] & 0xf8) >> 3) | ((sbus_buf[3] & 0x3f) << 5);                         // 取出缓存[2]的高5位，缓存[3]的低6位左移5位
        rc_ctrl.CH[2] = ((sbus_buf[3] & 0xc0) >> 6) | ((sbus_buf[4]) << 2) | ((sbus_buf[5] & 0x01) << 10); // 缓存[3]的高两位
        rc_ctrl.CH[3] = ((sbus_buf[5] & 0xfe) >> 1) | ((sbus_buf[6] & 0x0f) << 7);
        rc_ctrl.CH[4] = ((sbus_buf[6] & 0xf0) >> 4) | (((sbus_buf[7] & 0x7f)) << 4);
        rc_ctrl.CH[5] = ((sbus_buf[7] & 0x80) >> 7) | ((sbus_buf[8]) << 1) | ((sbus_buf[9] & 0x03) << 9);
        rc_ctrl.CH[6] = ((sbus_buf[9] & 0xfc) >> 2) | ((sbus_buf[10] & 0x1f) << 6);
        rc_ctrl.CH[7] = ((sbus_buf[10] & 0xe0) >> 5) | ((sbus_buf[11]) << 3);
        rc_ctrl.CH[8] = (sbus_buf[12]) | ((sbus_buf[13] & 0x07) << 8);
        rc_ctrl.CH[9] = ((sbus_buf[13] & 0xf8) >> 3) | (((sbus_buf[14] & 0x3f)) << 5);
        rc_ctrl.CH[10] = ((sbus_buf[14] & 0xc0) >> 6) | ((sbus_buf[15]) << 2) | ((sbus_buf[16] & 0x01) << 10);
        rc_ctrl.CH[11] = ((sbus_buf[16] & 0xfe) >> 1) | ((sbus_buf[17] & 0x0f) << 7);
        rc_ctrl.CH[12] = ((sbus_buf[17] & 0xf0) >> 4) | ((sbus_buf[18] & 0x7f) << 4);
        rc_ctrl.CH[13] = ((sbus_buf[18] & 0x80) >> 7) | ((sbus_buf[19]) << 1) | ((sbus_buf[20] & 0x03) << 9);
        rc_ctrl.CH[14] = ((sbus_buf[20] & 0xfc) >> 2) | ((sbus_buf[21] & 0x1f) << 6);
        rc_ctrl.CH[15] = ((sbus_buf[21] & 0xe0) >> 5) | ((sbus_buf[22]) << 3);
        rc_ctrl.Mark_data = sbus_buf[23];



        rc_ctrl.roll = (rc_ctrl.CH[0] - REMOTE_CH_MIN) * 1.276324186f - REMOTE_out_MAX; // sbus数据归一化统一至0-1000,计算参考来源见此函数下注释
        rc_ctrl.pitch = (rc_ctrl.CH[1] - REMOTE_CH_MIN) * 1.276324186f - REMOTE_out_MAX;
        rc_ctrl.throttle = (rc_ctrl.CH[2] - REMOTE_CH_MIN) * 1.276324186f - REMOTE_out_MAX;
        rc_ctrl.yaw = (rc_ctrl.CH[3] - REMOTE_CH_MIN) * 1.276324186f - REMOTE_out_MAX;
        rc_ctrl.SWA = (rc_ctrl.CH[4] - REMOTE_CH_MIN) * 1.276324186f - REMOTE_out_MAX;
        rc_ctrl.SWB = (rc_ctrl.CH[5] - REMOTE_CH_MIN) * 1.276324186f - REMOTE_out_MAX;
        rc_ctrl.SWC = (rc_ctrl.CH[6] - REMOTE_CH_MIN) * 1.276324186f - REMOTE_out_MAX;
        rc_ctrl.SWD = (rc_ctrl.CH[7] - REMOTE_CH_MIN) * 1.276324186f - REMOTE_out_MAX;
        rc_ctrl.VRA = (rc_ctrl.CH[8] - REMOTE_CH_MIN) * 1.276324186f - REMOTE_out_MAX;
        rc_ctrl.VRB = (rc_ctrl.CH[9] - REMOTE_CH_MIN) * 1.276324186f - REMOTE_out_MAX;
    }
}
/**
 * @brief 对sbus_to_rc的简单封装,用于注册到bsp_usart的回调函数中
 *
 */
// static void RemoteControlRxCallback()
// {
//     // DaemonReload(rc_daemon_instance);         // 先喂狗
//     sbus_to_rc(UART3_RECV_BUF); // 进行协议解析
// }
